#include "../include/uart.h"
#include "../include/spinlock.h"
#include "../include/types.h"

// 全局变量：UART发送锁（确保多线程发送不冲突）
struct spinlock tx_lock;
int panicked = 0;  //  panic状态标记（可选，暂不使用）

// 初始化UART（38400波特率，8N1格式）
void uart_init(void) {
    initlock(&tx_lock, "uart");  // 初始化发送锁
    
    // 1. 禁用UART中断（修改波特率前先关中断）
    uart_write(UART_IER, 0x00);
    
    // 2. 设置波特率为38400（QEMU UART支持）
    uart_write(UART_LCR, UART_LCR_BAUD_LATCH);  // 置位波特率锁存位
    uart_write(UART_RHR, 0x03);  // 波特率除数低8位（38400 = 115200 / 3）
    uart_write(UART_IER, 0x00);  // 波特率除数高8位（0x00）
    
    // 3. 设置数据格式：8位数据位，1位停止位，无奇偶校验（8N1）
    uart_write(UART_LCR, UART_LCR_EIGHT_BITS);
    
    // 4. 启用并清空FIFO（减少中断频率）
    uart_write(UART_FCR, UART_FCR_FIFO_EN | UART_FCR_CLEAR_FIFO);
    
    // 5. 启用接收和发送中断（可选，单线程可省略，多线程需开启）
    uart_write(UART_IER, UART_IER_RX_ENABLE | UART_IER_TX_ENABLE);
}

// 发送单个字符（带自旋锁同步，避免并发冲突）
void uart_putc(char c) {
    acquire(&tx_lock);  // 获取锁，确保独占发送
    
    // 等待发送缓冲区空闲（检查UART_LSR的TX_IDLE位）
    while ((uart_read(UART_LSR) & UART_LSR_TX_IDLE) == 0);
    
    // 发送字符（写入UART_THR）
    uart_write(UART_THR, c);
    
    release(&tx_lock);  // 释放锁
}

// 接收单个字符（无数据时返回-1）
int uart_getc(void) {
    // 检查接收缓冲区是否有数据（UART_LSR的RX_READY位）
    if (uart_read(UART_LSR) & UART_LSR_RX_READY) {
        return uart_read(UART_RHR);  // 读取字符
    } else {
        return -1;  // 无数据
    }
}
    